package leetcode.year2021.month9;

import java.util.Arrays;

public class _28_01JudgeSubStr567 {

  public static void main(String[] args) {
    String a = "ba";
    String b = "cabc";

    System.out.println(checkInclusion(a,b));
  }

  public static boolean checkInclusion(String s1, String s2) {
    int n = s1.length(), m = s2.length();
    if (n > m) {
      return false;
    }
    int[] cnt1 = new int[26];
    int[] cnt2 = new int[26];
    for (int i = 0; i < n; ++i) {
      ++cnt1[s1.charAt(i) - 'a'];
      ++cnt2[s2.charAt(i) - 'a'];
    }
    if (Arrays.equals(cnt1, cnt2)) {
      return true;
    }
    for (int i = n; i < m; ++i) {
      ++cnt2[s2.charAt(i) - 'a'];
      --cnt2[s2.charAt(i - n) - 'a'];
      if (Arrays.equals(cnt1, cnt2)) {
        return true;
      }
    }
    return false;


    // 这个解法是题目看错了，以为要顺序同样的字串
//    int n2 = s2.length();
//    int n1 = s1.length();
//
//    if (n1 > n2) {
//      return false;
//    }
//
//    int rk = 0;
//
//    for (int i = 0; i + n1 < n2 + 1; i++) {
//      for (int j = 0; j < n1; j++) {
//        if (s2.charAt(i+j) != s1.charAt(j)){
//          break;
//        }
//        rk++;
//      }
//      if (rk == n1) {
//        return true;
//      } else {
//        rk = 0;
//      }
//
//    }
//
//    for (int i = n2-1; i > 0; i--) {
//      for (int j = 0; j < n1; j++) {
//        if (s2.charAt(i-j) != s1.charAt(j)){
//          break;
//        }
//        rk++;
//      }
//      if (rk == n1) {
//        return true;
//      } else {
//        rk = 0;
//      }
//
//    }
//
//    return false;
  }

  /**
   * 给你两个字符串 s1 和 s2 ，写一个函数来判断 s2 是否包含 s1 的排列。如果是，返回 true ；否则，返回 false 。
   *
   * 换句话说，s1 的排列之一是 s2 的 子串 。
   *
   *  
   *
   * 示例 1：
   *
   * 输入：s1 = "ab" s2 = "eidbaooo"
   * 输出：true
   * 解释：s2 包含 s1 的排列之一 ("ba").
   * 示例 2：
   *
   * 输入：s1= "ab" s2 = "eidboaoo"
   * 输出：false
   *
   * 提示：
   *
   * 1 <= s1.length, s2.length <= 104
   * s1 和 s2 仅包含小写字母
   */
}
